'\" t
.\" bzflag
.\" Copyright (c) 1993-2020 Tim Riker
.\"
.\" This package is free software;  you can redistribute it and/or
.\" modify it under the terms of the license found in the file
.\" named COPYING that should have accompanied this file.
.\"
.\" THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
.\"
.TH "BZFS" "6" "@BUILD_DATE@" "@PACKAGE_STRING@" "BZFlag"
.SH "NAME"
bzfs \- BZFlag game server
.SH "SYNOPSIS"
.B bzfs
[\fB\-a \fIlinear\fR \fIangular\fR]
[\fB\-adminlagannounce \fR\fImilliseconds\fR]
[\fB\-admsg \fImessage\fR]
[\fB\-advertise \fIgroupname\fR[\fI,groupname\fR]...]
[\fB\-autoTeam\fR]
[\fB\-b\fR]
[\fB\-badwords \fIbadwordfile\fR]
[\fB\-ban \fIip\fR[\fI,ip\fR]...]
[\fB\-banfile \fIfilename\fR]
[\fB\-c\fR]
[\fB\-cache \fIworldCacheURL\fR]
[\fB\-cacheout \fIfilename\fR]
[\fB\-conf \fIconfigfile\fR]
[\fB\-cr]
[\fB\-d\fR]
[\fB\-density \fR\fInum\fR]
[\fB\-disableBots\fR]
[\fB+f \fR{\fIgood\fR | \fIbad\fR | \fIteam | \fR | \fIflag\-id\fR}[\fI{count}\fR]]
[\fB\-f \fR{\fIgood\fR | \fIbad\fR | \fIflag\-id\fR}]
[\fB\-fb\fR]
[\fB\-filterCallsigns\fR]
[\fB\-filterChat\fR]
[\fB\-filterSimple\fR]
[\fB\-g\fR]
[\fB\-gndtex \fR\fItexture\-name\fR]
[\fB\-groupdb \fIfile\fR]
[\fB\-h\fR]
[\fB\-handicap\fR]
[\fB\-help\fR]
[\fB\-helpmsg \fIfile\fR \fIname\fR]
[\fB\-i \fIinterface\fR]
[\fB\-j\fR]
[\fB\-jitterdrop \fIwarn\-count\fR]
[\fB\-jitterwarn \fR\fImilliseconds\fR]
[\fB\-lagannounce \fR\fImilliseconds\fR]
[\fB\-lagdrop \fIwarn\-count\fR]
[\fB\-lagwarn \fR\fImilliseconds\fR]
[\fB\-loadplugin \fR\fIname\fR[\fI,options\fR]]
[\fB\-masterBanURL \fIURL\fR]
[\fB\-maxidle \fR\fIseconds\fR]
[\fB\-mp
\fR{\fIcount\fR\~ | \~[\fIrogue-count\fR]\fB,\~\fR[\fIred-count\fR]\fB,\~\fR[\fIgreen-count\fR]\fB,\~\fR[\fIblue-count\fR]\fB,\~\fR[\fIpurple-count\fR]\fB,\~\fR[\fIobserver-count\fR]}]
[\fB\-mps \fR\fImax\-score\fR]
[\fB\-ms \fIshots\fR]
[\fB\-mts \fR\fImax\-score\fR]
[\fB\-noMasterBanlist\fR]
[\fB\-noradar\fR]
[\fB\-noSelfKills\fR]
[\fB\-noTeamKills\fR]
[\fB\-offa\fR]
[\fB\-p \fIport\fR]
[\fB\-packetlossdrop \fIwarn\-count\fR]
[\fB\-packetlosswarn \fR\fIpercent\fR]
[\fB\-passwd \fIpassword\fR]
[\fB\-pidfile \fIfilename\fR]
[\fB\-poll \fIvariable=value\fR]
[\fB\-printscore\fR]
[\fB\-publictitle \fIdescription\fR]
[\fB\-publicaddr \fIaddress\fR[\fI:port\fR]]
[\fB\-publiclist \fIurl\fR]
[\fB\-publickey \fIkey\fR]
[\fB\-q\fR]
[\fB+r\fR]
[\fB\-rabbit \fR[\fBscore\fR | \fBkiller\fR | \fBrandom\fR]]
[\fB\-recbuf \fIsize\fR]
[\fB\-recbufonly\fR]
[\fB\-recdir \fIdirectory\fR]
[\fB\-replay\fR]
[\fB\-reportfile \fIfilename\fR]
[\fB\-reportpipe \fIcommand\fR]
[\fB+s \fIflag\-count\fR]
[\fB\-s \fIflag\-count\fR]
[\fB\-sa\fR]
[\fB\-sb\fR]
[\fB\-set \fIname value\fR]
[\fB\-setforced \fIname value\fR]
[\fB\-sl \fIid num\fR]
[\fB\-spamtime \fItime\fR]
[\fB\-spamwarn \fIwarnLimit\fR]
[\fB\-speedtol \fIfactor\fR]
[\fB\-srvmsg \fImessage\fR]
[\fB\-st \fItime\fR]
[\fB\-sw \fIcount\fR]
[\fB\-synclocation\fR]
[\fB\-synctime\fR]
[\fB\-t\fR]
[\fB\-tftimeout \fItime\-limit\fR]
[\fB\-time \fR{\fItime\-limit\fR | \fIending-time\fR}]
[\fB\-timemanual\fR]
[\fB\-tk\fR]
[\fB\-tkannounce]
[\fB\-tkkr \fIpercent\fR]
[\fB\-ts \fR[\fImicros\fR]]
[\fB\-UPnP\fR]
[\fB\-userdb \fIfile\fR]
[\fB\-vars \fIfile\fR]
[\fB\-version\fR]
[\fB\-world \fIworld\-file\fR]
[\fB\-worldsize \fIworld size\fR]

.SH "DESCRIPTION"
\fBBzfs\fR is the server for \fBBZFlag\fR,
and it must be running to play.  It can be run on any system on the
network (including a player's system or one without graphics).
Terminating the server terminates the game in progress.

.SH "OPTIONS"
.TP 15
\fB\-a \fIlinear angular\fR
Sets the maximum linear and angular accelerations.
The units are somewhat arbitrary so you'll have to experiment to find
suitable values. Positive values will set limits to the acceleration
and lower they are, greater is the inertia.
Zero or negative values disable acceleration limits.
.TP 15
\fB\-adminlagannounce \fImilliseconds\fR
Announce players that lag more than \fImilliseconds\fR to admins.
.TP
\fB\-admsg \fImessage\fR
Define a message which will be broadcast to all players every 15 minutes.
This option can be used multiple times to define a multiline message.
.TP
.B \-advertise \fIgroupname,groupname,...\fR
Allows control of who can see this server on the server list.
Use: \fB\-advertise NONE\fR to make a private server (no one will see the
server, but global logins can be used). The default, if \-advertise is not
specified, is to allow everyone to see the server.
Otherwise, your server will only be listed to members of
the groups which you specify, eg: \fB\-advertise JOE,BOB\fR.
.TP
.B \-autoTeam
Automatically assign players to teams when they connect so that there
are an equal number of players on all available teams.  Players are
placed on teams that have the fewest players; otherwise they will be
placed on the weakest team.  Weakest team is the team with the lowest
combined kill ratio.
.TP
.B \-b
When \fB\-c\fR is supplied, this option randomly rotates the buildings.
.TP
\fB\-badwords \fIbadwordfile\fR
Specify a file that contains bad words that will be used when either
\fB\-filterCallsigns\fR or \fB\-filterChat\fR is enabled.
.TP
.B \-ban \fIip\fR[,\fIip\fR]...
Prohibits connections from the listed IP addresses. Trailing 255 bytes are
treated as mask bytes.
.TP
\fB\-banfile \fIfilename\fR
Specifies the name of a file where bzfs will store the banlist. It will
load the banlist from this file when it starts (if the file exists),
and write the banlist back to the file when someone gets banned or unbanned.
If this option isn't given the banlist will not be saved.
.TP
.B \-c
Enables the capture\-the\-flag style game. By default this allocates one team flag per team.
This can be modified see +f team. By default, the free\-for\-all style is used.
.TP
\fB\-cache \fIworldCacheURL\fR
Specifies the URL for the world cache file. This is a binary file that clients
will attempt to download before getting the world from the bzfs server.
.TP
\fB\-cacheout \fIfilename\fR
Save the currently specified world into a binary cache file and exit.
.TP
\fB\-conf \fIconfigfilename\fR
Specifies the name of a configuration file to be used to set all of the
bzfs options, rather than setting them on the command line.
.TP
.B \-cr\fR
Enables the capture\-the\-flag style game with random map.  You can
optionally specify a building density by providing a number (default
is 5).  One team flag per team is provided, but more can be added thru +f team.
By default, the free\-for\-all style is used.
.TP
.B \-d
Increase debugging level. If more \-d is given, more debugging info is obtained.
.TP
\fB\-density \fR\fInum\fR
Specify density for buildings, i.e.\& the higher the integer number, the more
buildings you will get. This applies to automatically generated maps only.
.TP
.B \-disableBots
Disallow clients from using the ROGER autopilot or from using robots.
.TP
\fB+f\fR {\fIgood\fR | \fIbad\fR | \fIteam\fR\fIflag\-id\fR}[\fI{count}\fR]
Forces the existence of the given flag.  If specified multiple times
for the same \fIflag\-id\fR, then that many flags will appear.  The
\fIgood\fR argument is equivalent to specifying \fB+f\fR once for
each kind of good flag. Same goes for the \fIbad\fR argument.  The
\fIteam\fR argument adds a team flag to each team,
assuming that the game style is capture the flag. The optional
\fI{count}\fR parameter allows the specification of multiple flags of the
same type. Note that the curly braces are required.
.TP
\fB\-f\fR {\fIgood\fR | \fIbad\fR | \fIflag\-id\fR}
Disallows random flags of the given type.  Required flags given by the
\fB+f\fR option are still provided.  The \fIbad\fR argument is equivalent
to specifying \fB\-f\fR once for each kind of bad flag.  Same goes for
\fBgood\fR, but you probably do not want to do that.
.br
An example of running a server with 40 to 50 flags except genocide would
be "+s 40 \-s 50 \-f G".  Similarly, "+f good{40} +f bad{10} \-f G{40}" would
give you exactly 40 good flags except genocide and 10 of each bad flag.
.TP
.B \-fb
Allow flags on box buildings.
.TP
.B \-filterCallsigns
Turn on the filtering of callsigns and mottos.  Callsigns and
mottos are compared against bad words provided via \fB\-badwords\fR.
.TP
.B \-filterChat
Turn on the filtering of chat messages.  Messages that contain words listed via
a \fB\-badwords\fR file are replaced with !@#$%^&* characters.
.TP
.B \-filterSimple
By default, all filtering is aggressive, matching much more than what is
strictly listed in a \fB\-badwords\fR file for convenience.  Providing
this option will make the \fB\-filterCallsigns\fR and \fB\-filterChat\fR
comparisons exact match only.
.TP
.B \-g
Quit after serving one game.
.TP
\fB\-gndtex \fItexture\-name\fR
Specify the name of the ground texture.
.TP
\fB\-groupdb \fIfile\fR
Load groups from file
.TP
.B \-h
Buildings are given random heights.
.TP
.B \-handicap
Players are given a handicap advantage based on their ability in
relation to the other players. Handicapped players will have faster
tanks and shots. The handicap is determined by the player's score in
relation to other players.
.TP
.B \-help
Shows a help page and lists all the valid flag id's.
.TP
\fB\-helpmsg \fIfile\fR \fIname\fR
Provide a message accessible by /help \fIname\fR, which sends no more
than the first 50 lines of \fIfile\fR to the player.
.TP
\fB\-i \fIinterface\fR
Server will listen for and respond to ``pings'' (sent via broadcast)
on the given interface.  Clients use this to find active servers on the
network. This is the TCP/UDP/IP address the server will listen on.
.TP
.B \-j
Allows jumping.
.TP
\fB\-jitterdrop \fIwarn\-count\fR
Kicks players after \fIwarn\-count\fR jitter warnings.
.TP
\fB\-jitterwarn \fImilliseconds\fR
Send warnings to players that jitter more than \fImilliseconds\fR.
.TP
\fB\-lagannounce \fImilliseconds\fR
Announce players that lag more than \fImilliseconds\fR in public.
.TP
\fB\-lagdrop \fIwarn\-count\fR
Kicks players after \fIwarn\-count\fR lag warnings.
.TP
\fB\-lagwarn \fImilliseconds\fR
Send warnings to players that lag more than \fImilliseconds\fR.
.TP
\fB\-loadplugin \fR\fIname\fR[\fI,options\fR]
Load the specified plugin. \fIname\fR can either be the name of
the plugin, or a path to its library file. Optionally, you can
provide any options the plugin requires.
.TP
\fB\-masterBanURL \fIURL\fR
Specify alternate URLs for the master ban file to be pulled from.
This argument may be provided multiple times.
.TP
\fB\-maxidle \fIseconds\fR
Kick players that did not play longer than \fIseconds\fR. Pausing players are
not kicked. If a player uttered a word recently, he will be kicked after
thrice the given time.
.TP
\fB\-mp\fR {\fIcount\fR | [\fIrogue\fR]\fB,\fR[\fIred\fR]\fB,\fR[\fIgreen\fR]\fB,\fR[\fIblue\fR]\fB,\fR[\fIpurple\fR]\fB,\fR[\fIobserver\fR]}
Sets the maximum number of players, total or per team.  A single value sets
the total number of players allowed.  Five comma separated values set the
maximum for each team.  If a count is left blank then no limit is set for
that team, except for the limit on the total number of players.  Both forms
may be provided.  For rabbit chase, the "rogue" value sets the total number
of non-observer player, and all other values must be zero.
.TP
\fB\-mps \fImax\-score\fR
Sets a maximum score for individual players.  The first player to reach
this score is declared the winner and the game is over.
.TP
\fB\-ms \fIshots\fR
Allows up to \fIshots\fR simultaneous shots for each player.
This is 1 by default.
.TP
\fB\-mts \fImax\-score\fR
Sets a maximum score for teams.  The first team to reach this score is
declared the winner and the game is over.
.TP
.B \-noMasterBanlist
Server will not attempt to load the master ban list from the internet.
.TP
.B \-noradar
Disable the use of the radar.
.TP
.B \-noSelfKills
Players are immune to their own shots.
.TP
.B \-noTeamKills
Players on the same team are immune to each other's shots. Rogue is excepted.
.TP
.B \-offa
Enables the Open\-Free\-for\-All style game. This is a teamless mode, similar to
the classic deathmatch in other games.
.TP
\fB\-p \fIport\fR
Listen for game connections on \fIport\fR instead of the default port.
Use \fB\-help\fR to print the default port, or use \fB\-d\fR debug printing.
.TP
\fB\-packetlossdrop \fIwarn\-count\fR
Kicks players after \fIwarn\-count\fR packetloss warnings.
.TP
\fB\-packetlosswarn \fIpercent\fR
Send warnings to players that have more more than \fIpercent\fR loss.
.TP
\fB\-passwd \fIpassword\fR
Specify a server administrator password for use in remote administration
such as /kick, /ban, /mute, etc.\&  messages.
.TP
\fB\-pidfile \fIfilename\fR
Specify a file where the server will write its process ID so it may be used for
remote administration.
.TP
\fB\-poll \fIvariable=value\fR
Configure several aspects of the in\-game polling system
.RS
.TP
\fBbanTime\fR
default number of minutes player should be banned (unspecified, the  default is 300)
.TP
\fBvetoTime\fR
max seconds authorized user has to abort poll (default is 20)
.TP
\fBvotePercentage\fR
percentage of players required to affirm a poll (unspecified, the default is 50.1%)
.TP
\fBvoteRepeatTime\fR
minimum seconds required before a player may request
another vote (default is 300)
.TP
\fBvotesRequired\fR
minimum number of additional votes required to make a
vote valid (default is 2)
.TP
\fBvoteTime\fR
maximum amount of time player has to vote, in seconds (default is 60)
.RE
.TP
.B \-printscore
Write score to stdout whenever it changes
.TP
\fB\-publictitle \fIdescription\fR
Advertise this server on the internet with the given \fIdescription\fR.
By default, a server will respond to broadcast queries, allowing clients
to find servers running on the standard port on the local subnet.
The \fB\-publictitle\fR option causes the server to register itself with
a list server, which clients can query to get a list of \fBbzfs\fR servers.
.TP
\fB\-publicaddr \fIaddress\fR[:\fIport\fR]
Advertise this server with the given \fIaddress\fR and \fIport\fR.
Normally a server advertises itself at the local address and port.
Some servers are not accessible from the internet at this address
(for example servers behind a firewall using Network Address
Translation).  Use this option to specify the address and/or port
that internet users should use to access this server.
.TP
\fB\-publiclist \fIurl\fR
Advertise this server on the list servers listed at \fIurl\fR.
Only has an effect when used with \fB\-publictitle\fR and/or \fB\-publicaddr\fR.
A built\-in url is used by default.  The \fBBZFlag\fR clients use the
same built\-in url so, by default, clients will see public servers
automatically.  This argument may be provided multiple times to
publicize a server to multiple list servers.
.TP
\fB\-publickey \fIkey\fR
Advertise this server on the list server(s) using the specified key.
Only has an effect when used with \fB\-publictitle\fR and/or \fB\-publicaddr\fR.
.TP
.B \-q
If specified, the server will not listen for nor respond to ``pings''.
\fBBZFlag\fR sends out these pings to give the user a list of
available servers.  This effectively makes the server private,
especially if the \fB\-p\fR option is also used.
.TP
.B +r
Makes most shots ricochet.
Super bullets, shock waves, and guided missiles do not.
.TP
\fB\-rabbit\fR [\fIscore\fR | \fIkiller\fR | \fIrandom\fR]
Enables the rabbit\-chase style game.  By default, the free\-for\-all
style is used.  You must specify the algorithm used to pick a new
rabbit when the old one dies.  The \fIscore\fR algorithm uses a modified
wins/(wins+losses) score and picks the top scoring player to be the new
rabbit.  The \fIkiller\fR algorithm specifies a reverse tag game where
whomever kills the rabbit becomes the new rabbit.  The \fIrandom\fR
algorithm randomly picks a new rabbit without regard to score.  (The
\fIscore\fR algorithm is the original behavior.)
.TP
.B \-recbuf \fIsize\fR
Start with the recording buffer active, with the specified size (in megabytes).
.TP
.B \-recbufonly
Disable recording straight to files
.TP
.B \-recdir \fIdirectory\fR
Specify the directory for record and replay files.
.TP
.B \-replay
Start the server in replay mode.
.TP
.B \-reportfile \fIfilename\fR
Write messages to the server admin written using the \fB/report\fR command to
this file. If neither \fB\-reportfile\fR or \fB\-reportpipe\fR is used the
\fB/report\fR command will be disabled.
.TP
.B \-reportpipe \fIcommand\fR
Pipe messages to the server admin written using the \fB/report\fR command to
this program or shell command. See \fB\-reportfile\fR.
.TP
\fB+s \fInum\-flags\fR
The server will have an extra \fInum\-flags\fR random super flags available
at all times.  The \fB\-f\fR option can be used to restrict which types of
flags will be added.  Required flags given by the \fB+f\fR option are not
included in the \fInum\-flags\fR total.
.TP
\fB\-s \fInum\-flags\fR
The server will have up to \fInum\-flags\fR random super flags available at
any time.  The \fB\-f\fR option can be used to restrict which types of flags
will be added.  Required flags given by the \fB+f\fR option are not included
in the \fInum\-flags\fR total.
.TP
.B \-sa
Antidote flags are provided for players with bad flags.
.TP
.B \-sb
Allow spawns on box buildings.
.TP
.B \-set \fIname value\fR
Set BZDB variable \fIname\fR to \fIvalue\fR.
.TP
.B \-setforced \fIname value\fR
Set BZDB variable \fIname\fR to \fIvalue\fR, even if the variable does not exist.
.TP
\fB\-sl \fIid num\fR
Restrict flag \fIid\fR to \fInum\fR shots.
.TP
\fB\-spamtime \fItime\fR
Minimum time between player chat messages that are alike.
.TP
\fB\-spamwarn \fIwarnLimit\fR
Number of warnings a player/spammer gets, who  violates \-spamtime.
.TP
\fB\-speedtol \fIfactor\fR
Override the default speed auto kick factor. The factor should not be less then 1.0. The factor is a multiplier.
.TP
\fB\-srvmsg \fImessage\fR
Define a server welcome message. This option can be used multiple times
to define a multiline message.
.TP
\fB\-st \fItime\fR
Bad flags are automatically dropped after \fItime\fR seconds.
.TP
\fB\-sw \fIcount\fR
Bad flags are automatically dropped after \fIcount\fR wins.  Capturing
a team flag does not count as a win.
.TP
.B \-synclocation
Forces all clients to use the same location (longitude and latitude).
.TP
.B \-synctime
Forces all clients to use the same time of day.  The current time is
determined by the server's clock.  This disables the + and \- keys on
the clients.
.TP
.B \-t
Adds teleporters to the game.
.TP
\fB\-tftimeout \fItime\-limit\fR
If the last player in a team leaves while someone else is carrying the team
flag, the team flag will not reset until it is captured, or until the player
drops it and it is left alone for some time. This option specifies the number
of seconds that the flag should be left alone before it is reset. The
default value is 30.
.TP
\fB\-time \fR{\fItime\-limit\fR | \fIending-time\fR}
Sets a time limit on the game to \fItime\-limit\fR or \fIending-time\fR. The game will be
stopped \fItime\-limit\fR seconds after the first player connects, or at \fIending-time\fR,
whichever is given. The \fIending-time\fR should be given in hh:mm:ss format, but does not
need minute and second arguments. If only hour is given, it must end in ':'. Each
unspecified argument is set to 0.
.TP
\fB\-timemanual\fR
When using \fB\-time\fR, the countdown will start when the first player
joins. With \fB\-timemanual\fR, the countdown has to be started manually
using the \fI/countdown\fR command. This is useful for matches.
.TP
.B \-tk
Changes the default behavior where a player dies when he kills a teammate.
When using this option, he will just get a \-1 score penalty for the kill but
not be killed in game.
.TP
.B \-tkannounce
Announce teamkills to the admin channel.
.TP
\fB\-tkkr \fIpercent\fR
Kicks players whose team killing to normal kill ratio is greater than
\fIpercent\fR [1\-100]. A start up grace period is given to players.
.TP
\fB\-ts \fR[\fImicros\fR]
Include timestamp information in DEBUG output \(em useful for logging.
If \fImicros\fR is specified, microseconds will be added to the timestamp.
.TP
\fB\-UPnP\fR
If enabled during build, bzfs try to communicate with the Gateway to set Port
Forwarding and to supply information not specified with \-i (local interface)
and \-publicaddr
.TP
\fB\-userdb \fIfile\fR
Load group associations from file
.TP
\fB\-vars \fIfile\fR
Loads values for game configurable variables from \fIfile\fR. Entries are
one per line in the form: \fBset variable value\fR. For a list of variables
that are configurable, in the BZFlag client, send a message with
\fI/set\fR as the text.
.TP
.B \-version
Prints the version number of the executable.
.TP
\fB\-world \fIworld\-file\fR
Reads a specific BZFlag \fB.bzw\fR world layout file for the game map.
.TP
\fB\-worldsize \fIworld\-size\fR
Changes the size for random maps
.RE
.SS Notes
The server uses nearly zero CPU time when nobody is playing, and even
during a game the server uses very little CPU, so it's not a burden on
the system to leave one running and it won't interfere with a player
using the same system (except on Windows 95, which \fIreally\fR
sucks at multitasking).  The server will continue to run until
terminated.  If a game is in progress when the server goes down,
all players will be kicked off and the game will be aborted without
warning.  The server resets itself when all players have quit.  All
players must quit to reset the server when a game is over (because of
a score or time limit).
.PP
The following game styles are recommended starting points.
.RS
.TP 15
\fB\-c\fR [\fB\-b\fR]
Basic capture\-the\-flag game.  It teaches teamwork and dogfighting skills.
.TP
\fB\-s \-t\fR
Free\-for\-all with superflags and teleporters.  Teaches players how to use
superflags and teleporters for maximum effect.  You may want to allow
players to drop bad flags with any of \-sa, \-st, and \-sw.
.RE
.PP
Notice that the maximum number of shots for these styles is one.  Having
low shot counts can greatly increase general playability and learning speed.
However, this is not always true of every game style or game world, and a skilled
player will learn to deal with a variety of shot counts.  Single shot games
have additional disadvantage in WAN games where lag/jitter can cause unfair
advantage.  Single shot, non-Jump games will teach valuable lessons in dodging,
however, and are excellent starting points for the beginner.
.SS Networking
Communication between the server and clients (i.e.\& between \fBbzfs\fR and
\fBbzflag\fR) during a game is via TCP and UDP.  Use the \fB\-help\fR option
to get
the server's default port.  If there's a firewall between the server and
client, the firewall must accept connections from the client to this port
and forward them to the server.
.PP
Clients can search for servers by sending broadcast UDP
packets.  But they must be on the same local area network for this to work.
Clients can also find servers
advertised using \fI\-publictitle\fR by querying list servers.
.PP
Game information is relayed through the server. Some communication between
clients, such as position and orientation information, is normally sent via UDP
packets.  Other data, like flag grab and kill messages, are sent to the server
via TCP. The server then turns around and broadcasts these packets  to all
players. Since being in a game implies connection to the server, all players
are guaranteed to get all messages sent via TCP.  But the UDP
packets may be discarded.  If other players can see your tank in the game but
it never appears to move and shots go through it, chances are high that your
UDP connection is not working.
.SS "Worlds"
BZFlag worlds come in two varieties, randomly generated ones, and
human designed ones. By default, bzfs uses randomly generated world
unless you specify the \-world command line or configuration file
option. The world file specified by the \-world option is a text based
file that contains a list of world objects. This file can be created
using programs found on github, or can be hand edited.  See the bzw(5)
manual page for more details.


.SH "GENERAL SERVER COMMANDS"
.TP
.B /clientquery \fR[\fIcallsign\fR]
Retrieve client version info from all users, or just CALLSIGN if given. Example:
.ft CW
.nf
.ne 2
/clientquery MrApathyCream
MrApathyCream: Version: BZFlag 1.11.6\-20040729\-gnu\-linux\-SDL
.ft R

.TP
.B /date, /time
Responds with the current server local time. /date and /time are exactly the same. Example:
.ft CW
.nf
.ne 1
Tuesday September 08 06:45:54 2004
.ft R

.TP
.B /flaghistory
Lists what flags players have grabbed in the past. Example:
.ft CW
.nf
.ne 3
MrApathyCream: (<\-) (\->) (O) (CB) (M) (B) (JM) (WA)
Gerbol: (L) (GM) (L) (GM) (CL) (ST) (GM) (L)
captain_macgyver: (SB) (SW)
.ft R

.TP
.B /idlestats
Displays the idle time in seconds for each player. A player is idle when
he is dead and has not respawned yet. Example:
.ft CW
.nf
.ne 3
MrApathyCream: 0s
Gerbol: 80s
captain_macgyver: 13s
.ft R

.TP
.B /lagstats
Lists network delays, jitter and number of lost resp. out of order packets by player. Example:
.ft CW
.nf
.ne 3
MrApathyCream 335 +\- 10ms
Gerbol 210 +\- 3ms
captain_macgyver 155 +\- 0ms  12% lost/ooo
.ft R

.TP
.B /me \fIaction\fR

This command displays an "action" that is conveyed to another player.  It allows
for a little more expressivity in the game.  For example: "/me is hunting wabbits"
turns into a message like "TimRiker is hunting wabbits" that gets displayed
differently to other players.

.TP
.B /msg \fI"callsign"\fR \fImessage\fR

This command allows a player to send a message to another player.  Similar to using
the "," and "." message keys in the game and then selecting your recipient, this
will send some message to particular player.  The quotes are optional.

.TP
.B /part \fR[\fImessage\fR]
Leave the server with a goodbye message (similar to IRC's /part)
.ft CW
.nf
.ne 2
/part Gotta go! bye everyone!
.ft R

.TP
.B /password \fIpassword\fR
Attempt to gain administrator status Example:
.ft CW
.nf
.ne 2
/password supersecretpassword
You are now an administrator!
.ft R

.TP
.B /poll \fR{{\fIban\fR | \fIkick\fR} \fIcallsign\fR | vote {\fIyes\fR | \fIno\fR} | veto}
Interact and make requests of the bzflag voting system via the /poll command.
The ban and kick subcommands request a vote to respectively ban or kick some
player.  The playername is expected as the next argument.  The vote and veto
commands behave identical to the /vote and /veto command counterparts,
expecting the same arguments in following.  By default, you must be registered
to request or vote on a poll, and an admin to veto.

.TP
.B /quit \fR[\fImessage\fR]
Quit the game with a goodbye message (similar to IRC's /quit)
.ft CW
.nf
.ne 2
/quit Gotta go! bye everyone!
.ft R

.TP
.B /report \fImessage\fR
Write a message to the server administrator. Example:
.ft CW
.nf
.ne 2
/report I like this map!
.ft R

.TP
.B /uptime
Prints server's current running time in days, hours, mins and secs.

.TP
.B /vote \fR{\fIyes\fR | \fIno\fR}
If there is a poll active, this command will place a vote in favor or in
opposition to the poll.  Multiple languages are supported as a vote argument
in addition to "yes" and "no".  By default, you must be registered to vote on
a poll.


.SH "SERVER ADMINISTRATIVE COMMANDS"
.BR
.TP
.B /ban \fR{\fIip\fR | \fIipList\fR | \fI#slot\fR | \fI"Player Name"\fR | \fIplayerName\fR} \fIduration\fR \fIreason\fR

Ban players using the specified IPs for certain length of time
from using this server.
<duration> can be:
    'short' or 'default' for the default ban time
    'forever' or 'max' for infinite bans
    a time in the format <weeks>W<days>D<hours>H<minutes>M
    just a number of minutes

Examples:
.ft CW
.nf
.ne 4
/ban 35.23.43.66 2 cheating
bans player with specific ip for 2 minutes
/ban 35.23.*.*,47.23.17.* 0 Cheaters
bans all ips in this range forever
/ban 36.37.2.8 2h30m "ShootMe" was abusing players
bans specific ip for 2.5 hours with given reason
/ban #5 60m Rejoining
bans player using slot 5 for 60 minutes with given reason
/ban "Tanker" max cheating
bans the player Tanker forever because cheating

Note: Slots numbers are only displayed in admins clients.
Duration and reason are required.
.ft R

.TP
.B /banlist
List all of the IPs currently banned from this server. Example:
.ft CW
.nf
.ne 5
/banlist
IP Ban List
\-\-\-\-\-\-\-\-\-\-\-\-
35.23.43.66 (2 minutes) banned by Tankmaster
    reason: Cheaters
47.23.17.* banned by Tankslave
.ft R

.TP
.B /checkip \fIip\fR
Check whether the IP is banned and print the corresponding rule. This does not
cover hostbans. Example:
.ft CW
.nf
.ne 5
/checkip 35.23.43.66
35.23.43.66 is banned:
35.23.43.66 banned by Tankmaster
    reason: Cheaters
.ft R

.TP
.B /countdown \fR[\fIseconds\fR]
Starts the countdown sequence for a timed game.  The countdown
sequence length can optionally be specified in seconds.  Examples:
.ft CW
.nf
.ne 2
/countdown
/countdown 3
.ft R

.TP
.B /flag reset \fR{\fIall\fR|\fIunused\fR|\fIteam\fR|\fIFlagId\fR}
Repositions flags. If \fIunused\fR is specified, flags carried
by tanks are not affected. Using the \fIteam\fR option only
resets team flags, whereas specifying a flag id (such as GM) only
repositions flags of this type. If \fInoteam\fR is specified,
team flags will not be reset. Examples:
.ft CW
.nf
.ne 2
/flag reset unused noteam
/flag reset G
.ft R

.TP
.B /flag show
Shows all flags with information. Example:
.ft CW
.nf
.ne 2
0: p:\-1 r:1 g:1 1:V s:1 p:159.1x43.2x0.0
1: p:2 r:1 g:1 1:SW s:1 p:209.1x143.2x10.0
2: p:\-1 r:1 g:3 1:L s:1 p:\-29.1x301.2x0.0
.ft R

.TP
.B /flag up
Removes all flags from the game

.TP
.B /gameover
Ends the current game

.TP
.B /handicap
Shows the handicap boost percentage for every player

.TP
.B /hostban \fIhostpattern\fR \fIduration\fR \fIreason\fR
Ban players using the specified hostnames for a certain length of time from using this server.
Example:
.ft CW
.nf
.ne 4
/hostban *.foo.com 2 cheating
bans all players from foo.com for 2 minutes
.ft R

.TP
.B /hostbanlist
List all of the host patterns currently banned from this server.

.TP
.B /jitterwarn \fR[\fItime\fR]
Change the maximum allowed jitter time. Example:
.ft CW
.nf
.ne 2
/jitterwarn 50
.ft R

.TP
.B /jitterdrop \fR[\fIcount\fR]
Change the number of jitter warnings given before a player is kicked. Example:
.ft CW
.nf
.ne 2
/jitterdrop 3
.ft R

.TP
.B /kick \fR{\fI"Player Name"\fR | \fIplayerName\fR | \fI#slot\fR} \fIreason\fR
Kick a player off the server. Example:
.ft CW
.nf
.ne 2
/kick Gerbol
You were kicked off the server by MrApathyCream

/kick #1 Team killing
Kick the player using slot 1 because Team Killing

Note: Slots numbers are only displayed in admins clients.
A reason is required
.ft R

.TP
.B /kill \fR{\fI"Player Name"\fR | \fIplayerName\fR | \fI#slot\fR} [\fIreason\fR]
Kill a player just like when shooting. Example:
.ft CW
.nf
.ne 2
/kill Gerbol
kill the player named Gerbol

/kill #4 teamkilling
Kill the player using slot 4 because teamkilling
.ft R

.TP
.B /lagwarn \fR[\fItime\fR]
Change the maximum allowed lag time. Example:
.ft CW
.nf
.ne 2
/lagwarn 300
.ft R

.TP
.B /lagdrop \fR[\fIcount\fR]
Change the number of lag warnings given before a player is kicked. Example:
.ft CW
.nf
.ne 2
/lagdrop 3
.ft R

.TP
.B /modcount \fR[\fIseconds\fR]
Change the time on the clock by the specified number of seconds. Example:
.ft CW
.nf
.ne 2
/modcount +320
.ft R

.TP
.B /mute \fR{\fI#slot\fR | \fIcallsign\fR}
Allows a server admin to remove the ability for a player to communicate with
other players. Once muted the player may only talk to admins on the server.
This command removes the TALK permission that is enabled by default for all
players. (disabling TALK by default would let you run a "silent" server)

.TP
.B /packetlosswarn \fR[\fItime\fR]
Change the maximum allowed packetloss. Example:
.ft CW
.nf
.ne 2
/packetloss 1
.ft R

.TP
.B /packetlossdrop \fR[\fIcount\fR]
Change the number of packetloss warnings given before a player is kicked. Example:
.ft CW
.nf
.ne 2
/packetloss 3
.ft R

.TP
.B /playerlist
List player names and IP addresses. Example:
.ft CW
.nf
.ne 4
/playerlist
[0]MrApathyCream: 35.23.65.44:4808 udp id
[1]Gerbol: 130.123.1.55:4909 udp id
[2]captain_macgyver: 15.32.122.51:3201 udp id
.ft R

.TP
.B /record file \fIfilename\fR
Start recording directly to a file

.TP
.B /record list
List all files in the recordings directory

.TP
.B /record rate \fIseconds\fR
Set the time between game state updates stored in the recording. This will affect
the granularity of the 'skips' you can do while replaying a file. It will also
make the recording files bigger if it is set to a faster update rate.

.TP
.B /record save \fIfilename\fR [\fIseconds\fR]
Save the recording buffer into a file. If seconds is specified, then only save
that many previous seconds into the file.

.TP
.B /record size \fImegabytes\fR
Set the size of the recording memory buffer

.TP
.B /record start
Start recording into the memory buffer

.TP
.B /record stats
Display the statistics for the current recording (file or buffered)

.TP
.B /record stop
Stop recording into the memory buffer

.TP
.B /replay list
List all files in the recordings directory

.TP
.B /replay load \fR{\fIfilename\fR | \fI#index\fR}
Load the specified recording file by name, or by index
(same indices as produced by the 'replay list' command)

.TP
.B /replay loop
Start looping the recording. This will oftentimes require that all players connected
to the server rejoin  (to reload the map, etc...)

.TP
.B /replay play
Start playing the recording. This will oftentimes require that all players connected
to the server rejoin  (to reload the map, etc...)

.TP
.B /replay skip \fR[{\fI+\fR | \fI\-\fR} \fIseconds\fR]
If seconds is specified, then skip that amount of time in the recording.
Otherwise, skip forwards until there is activity.

.TP
.B /replay stats
Show the current replay status (filename, position, etc...)
.BR

.TP
.B /say \fImessage\fR
Generate a public message sent by the server. Example:
.ft CW
.nf
.ne 4
/say This is a servermessage
.ft R

.TP
.B /sendhelp \fR{\fI"Player name"\fR | \fIplayerName\fR | \fI#slot\fR}  \fIhelp page\fR
Send the specified help page to a user
.ft CW
.nf
.ne 4
/sendhelp register "Foo"
Send the the help page 'register' to the player Foo
.ft R

.TP
.B /shutdownserver
Stop serving BZFlag on this server

.TP
.B /superkill
Kick all players off the server

.TP
.B /unmute \fR{\fI#slot\fR | \fIcallsign\fR}
Allows a server admin to restore the TALK permission to a previously muted
player.

.TP
.B /veto
If there is a poll active, this will cancel the poll.  By default, you must be
an admin to veto a poll.

.TP
.B /viewreports
View the server's report file.
.BR


.SH "USER MANAGEMENT"
Generally, you start with empty files for the user and password
databases.  These are maintained by the server, and modifiable through
server commands.  Users in turn belong to groups.  Groups are
generally customized to perhaps allow administrative control to
trusted users.

There are both local and global groups, i.e.\& groups that are available
across the entire BZFlag network.  In setting up a server, you may
want to specify global groups that will allow already well known and
trusted users to police your server and help maintain control against
cheaters and abuse.

The server will automatically create three groups: EVERYONE, VERIFIED,
and LOCAL.ADMIN.  EVERYONE  has  ACTIONMESSAGE, ADMINMESSAGESEND,
CLIENTQUERY, DATE, FLAGHISTORY, IDLESTATS, LAGSTATS, PRIVATEMESSAGE,
SHOWMOTTO, SPAWN and TALK by default. VERIFIED has LISTPLUGINS, POLL,
POLLKICK, POLLBAN, POLLKICK, POLLSET, POLLFLAGRESET, REPORT and VOTE.
The LOCAL.ADMIN group has almost every permission possible (similar to
granting admin powers via /password).

Once the server is running, users can register their callsigns and
admins can set their group memberships. Users can use any command that
their permissions allow. Every user, registered or not, is part of the
EVERYONE group. When a user identifies, they become part of the
VERIFIED group.

In addition, there are global groups available that persist
network\-wide.  Users that register their callsigns on the BZFlag
website at https://forums.bzflag.org/ have the ability to globally
authenticate by providing a password from within the client.  When
they authenticate, bzfs will ask the list server if they belong to any
of the groups listed in your group database file that are not prefixed
with "LOCAL.".  If they are a member of a group in question, then they
are granted the permissions you specify for that group.

A group database file is set up to contain the specific local and
global groups you care to have on your server in addition to default groups
and exactly which permissions are granted by each.  These files are laid out
with one line per group, using the following format:

GROUP_NAME: [*Group] [ +| \-| !]perm1 [ +| \-| !]perm2 ... permN


*Group: inherit permissions from existing group "Group"
.br

+perm: add perm to this group
.br

\-perm: remove perm from this group
.br

!perm: forbid perm for this group. makes perm inaccessible whether it's granted
from another group or not

If no operator is given with a permission it is handled like +perm. A group
line for a previously existing group adds to already granted permissions. That
way you can spread a group's definition over several lines:

GROUP_NAME: +perm1 +perm2
.br
GROUP_NAME: +perm3 +perm4 \-perm5

Group names cannot have spaces, quotes, or other special characters in
them.  This would be a sample line defining a "cop" group:

COPS: +KICK +SHORTBAN +BANLIST

Now a group USERADMIN with all permissions granted to COPS plus some additional
could look like this:

USERADMIN: *COPS +BAN +UNBAN

Probably you want to define customized permissions for the default
group "VERIFIED" instead of those automatically assigned by the server:

VERIFIED: \-ALL +perm1 +perm2 ...

Or you want to disable the /poll command entirely?

EVERYONE: !POLL

To distinguish between a group that is local and one that is global,
use the "LOCAL." prefix as part of the group name, e.g.:

LOCAL.OPERATOR: BANLIST


The available permissions are as follows:

.TS
l l.
ACTIONMESSAGE	/me
ADMINMESSAGERECEIVE	player receives messages sent to admin channel
ADMINMESSAGESEND	player may send messages on the admin channel
ALL	\fBall\fR permissions available
ANTIBAN	player is immune to /ban
ANTIKICK	player is immune to /kick
ANTIKILL	player is immune to /kill
ANTIPOLL	player is immune to /poll
ANTIPOLLBAN	player is immune to /poll ban
ANTIPOLLKICK	player is immune to /poll kick
ANTIPOLLKILL	player is immune to /poll kill
BAN	/ban /hostban
BANLIST	/banlist /hostbanlist
CLIENTQUERY	/clientquery
COUNTDOWN	/countdown
ENDGAME	/gameover
FLAGHISTORY	/flaghistory
FLAGMASTER	/flag
FLAGMOD	/flag reset /flag show /flag history
HIDEADMIN	player doesn't show the @ sign
IDLESTATS	/idlestats
INFO	not implemented
JITTERWARN	/jitterwarn /jitterdrop
KICK	/kick
LAGSTATS	/lagstats
LAGWARN	/lagwarn /lagdrop
LISTPERMS	not implemented
LISTPLUGINS	/listplugins
MASTERBAN	/masterban
MODCOUNT	/modcount
MUTE	/mute
PACKETLOSSWARN	/packetlosswarn /packetlossdrop
PLAYERLIST	/playerlist
PLUGINS	/listplugins /loadplugin /unloadplugin
POLL	/poll
POLLBAN	/poll ban
POLLFLAGRESET	/poll flagreset
POLLKICK	/poll kick
POLLSET	/poll set
PRIVATEMESSAGE	/msg
RECORD	/record
REJOIN	allows instant rejoin, regardless of _rejoinTime
REMOVEPERMS	/removegroup
REPLAY	/replay
REPORT	/report
REQUIREIDENTIFY	user must use global registration
SAY	/say
SENDHELP	/sendhelp
SETALL	use of all set/remove commands
SETPERMS	/setgroup
SETPASSWORD	not implemented
SETVAR	/set /reset
SHORTBAN	/ban (with a limited duration)
SHOWADMIN	player shows an @ regardless of having 'shortban' perm
SHOWOTHERS	/showgroup /showperms (on others)
SHUTDOWNSERVER	/shutdownserver
SPAWN	join game as a player. observers don't need this flag.
SUPERKILL	/superkill
TALK	allows all players to send messages
UNBAN	/unban /hostunban
UNMUTE	/unmute
VETO	/veto
VOTE	/vote
.TE

.TP
.B /grouplist
Lists the available user groups

.TP
.B /groupperms
Lists the permissions for each group

.TP
.B /masterban \fR{\fIflush\fR | \fIreload\fR}
Forces the server to flush any bans from the master server. If reload is specified
instead of flush, also reloads bans from the the internet. Local bans are unaffected.
This command requires the UNBAN permission.

.TP
.B /reload
Reloads the user, group, and password files (for synchronization between
multiple servers on the same machine)

.TP
.B /removegroup \fIcallsign\fR \fIgroup\fR
Remove a user from a group

.TP
.B /setgroup \fIcallsign\fR \fIgroup\fR
Add a user to a group

.TP
.B /showgroup \fIcallsign\fR
Lists the groups that a registered user is a member of


.SH "SEE ALSO"
bzflag(6), bzadmin(6), bzw(5)
